home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
m68k
/
tutor.arc
/
OF.SA
< prev
next >
Wrap
Text File
|
1990-01-05
|
8KB
|
259 lines
OF IDNT 1,0 OF & PERIOD Command 12/18/81
XDEF OFCMD
XDEF PERCMD
XDEF PNTCLS
XDEF PNTREG
SPC 1
XREF FIXBUF
XREF FIRST
XREF FNEXTF
XREF GETA
XREF GETHEX
XREF MACSBUG
XREF MSG
XREF.S OFFSET
XREF OUT1CR
XREF OUTPUT
XREF PNT4HX
XREF PNT8HX
XREF PORTIN1
XREF PUTHEX
XREF.S REGA7
XREF.S REGPC
XREF.S REGS
XREF.S REGSR
XREF.S REGUS
XREF SYNTAX
XREF WHAT
PAGE
SECTION 11
SPC 2
* .* HANDLER
* GET TWO CHARACTERS FOLLOWING PERIOD
*
SPC 1
PERCMD LSL.W #8,D1
MOVE.B (A5),D1 D1 = 2ND,3RD CHARACTERS
SUB.L #1,A5 A5 = POINTER TO 2ND CHAR (1ST REAL CHARACTER)
SPC 1
LEA REGTBL(PC),A0
PER4 CLR.L D7
MOVE.W (A0)+,D7 SAVE FIRST WORD FOR END OF TABLE TEST
MOVE.W (A0)+,D0 GET REAL REGISTER ID INTO D0
CMP.W #$FFFF,D7 ARE WE AT THE END OF THE TABLE?
BEQ WHAT YES...THEN WE DIDNT FIND IT
SPC 1
CMP.B #'@',D0
BNE.S PER3 NOT @
SPC 1
* THIRD CHAR MUST BE NUMERIC 0 - 7
MOVE.B D1,D0 ALLEGED DIGIT
CMP.B #'0',D0
BMI PER4 NOT A DIGIT
CMP.B #'8',D0
BPL PER4 NOT A DIGIT
SPC 1
PER3 CMP.W D1,D0
BNE PER4 MISS-MATCH
PAGE
*******************************************************************
* AT THIS TIME WE HAVE FOUND THE ENTRY IN THE "REG TABLE" *
* WE NOW NEED TO EXTRACT AND USE THE OFFSET *
*******************************************************************
SPC 1
LEA FIRST(PC),A0 A0 = Start of VERSAbug RO
ADD.L D7,A0 Add offset
JMP (A0) Now go to the calculated location
SPC 2
***************
REGTBL EQU *
***************
SPC 1
DC.W SETA7-FIRST Stack Register Routine
DC.W 'A7' *
SPC 1
DC.W SETPC-FIRST Program Counter Routine
DC.W 'PC' *
SPC 1
DC.W SETSR-FIRST Status Register Routine
DC.W 'SR' *
SPC 1
DC.W SETUS-FIRST User Stack Routine
DC.W 'US' *
SPC 1
DC.W SETSS-FIRST System Stack Routine
DC.W 'SS' *
SPC 1
DC.W SETD-FIRST Data Register Routine
DC.W 'D@' *
SPC 1
DC.W SETA-FIRST Address Register Routine
DC.W 'A@' *
SPC 1
DC.W PNTCLSA-FIRST All Address Registers Routine
DC.W 'A ' *
SPC 1
DC.W PNTCLSD-FIRST All Data Registers Routine
DC.W 'D ' *
SPC 1
DC.W SETRN-FIRST All Registers Routine
DC.W 'R@' *
SPC 1
DC.W $FFFF END OF TABLE
PAGE
* PRINT & INPUT REGISTER ROUTINES
*
SETD LEA REGS,A4 START OF REGISTERS
BRA.S SETR
SPC 1
SETA LEA REGS+32,A4 OFFSET IN REGISTER TABLE
BRA.S SETR
SPC 1
SETPC LEA REGPC,A4 WHERE PC IS
BRA.S SETR0
SPC 1
SETSR LEA REGSR,A4 WHERE SR IS
BRA.S SETR0
SPC 1
SETA7 MOVE.L REGSR,D1 GET CONDITION CODES
AND.W #$2000,D1 CHECK SUPERVISOR BIT
BEQ.S SETUS
SETSS LEA REGA7,A4 WHERE SUPERVISOR STACK IS
BRA.S SETR0
SPC 1
SETUS LEA REGUS,A4 USER STACK
BRA.S SETR0
SPC 1
SETRN LEA OFFSET,A4 SET OFFSET
CMP.B #'7',D1
BEQ SYNTAX NOT ALLOWED TO CHANGE A7
SPC 1
*
* ROUTINE TO ENTER DATA FOR A SINGLE REGISTER
* A5-A6 ARE COMMAND BUFFER
* D0 HAS REGISTER DIGIT A4 HAS CLASS OFFSET
SETR BSR GETHEX GET REG NUMBER
LSL.L #2,D0 SHIFT LEFT...MULT BY 4
ADD.L D0,A4 A4 NOW HAS EXACT ADDRESS
SETR0 ADD.L #2,A5 NOW FIND PARAMETERS
MOVE.B #':',D0 SEE IF COLON IN COMMAND
BSR.S SCAN
BEQ.S SETR5
*SEE IF ANY PARAMER (HEX)
LEA SETR4(PC),A0 WHERE TO GO IF NO PARAMETERS
BSR FNEXTF FIND NEXT FIELD
SPC 1
CMP.B #'.',D0
BEQ.S SEMACS PERIOD; GET OUT
SPC 1
BSR GETA GET ADDRESS VALUE
MOVE.L D0,(A4) SAVE NEW VALUE
SEMACS BRA MACSBUG
SPC 1
*JUST PRINT IT
SETR4 BSR.S PRINTR FIX UP TO PRINT
BRA MSG GO PRINT MESSAGE-GO TO MACSBUG
SPC 1
SETR5 BSR.S SETSR1
BRA SEMACS
SPC 1
SETSR1 BSR.S PRINTR FIX UP TO PRINT
MOVE.B #' ',(A6)+ SPACE
MOVE.B #'?',(A6)+ PROMPT
MOVE.B #' ',(A6)+ SPACE
BSR OUTPUT PRINT IT
SPC 1
BSR FIXBUF
BSR PORTIN1
SPC 1
LEA SETSR15(PC),A0 A0=DEFAULT (NO PARM) ADDRESS
BSR FNEXTF FIND FIELD
SPC 1
CMP.B #'.',D0
BEQ SEMACS PERIOD; GET OUT
SPC 1
BSR GETA CONVERT IT
MOVE.L D0,(A4) STORE NEW DATA
SPC 1
SETSR15 DS 0
RTS
SPC 2
* SEE IF CHARACTER IS IN BUFFER
SCAN MOVE.L A5,A0 A0 IS WORKING SCANNER
SCAN2 CMP.L A6,A0 SEE IF AT END OF BUFFER
BHI.S RETURN5
CMP.B (A0),D0 LOOK AT CHARACTER
BEQ.S RETURN5
ADD.L #1,A0 GET PAST CHARACTER
BRA.S SCAN2
RETURN5 RTS
PAGE
* ROUTINE TO SET UP TO PRINT REG
PRINTR BSR FIXBUF
SPC 1
ADD.L #3,A6 GET PAST REG NAME (.XX)
MOVE.B #'=',(A6)+ PUT IN EQUAL SIGN
MOVE.L (A4),D0 GET VALUE
CMP.L #REGSR,A4 SEE IF THIS IS CONDITION CODES
BNE.S PRINTR2
BSR PNT4HX JUST PRINT WORD
RTS
SPC 1
PRINTR2 BSR PNT8HX PRINT THE VALUE
RTS
PAGE
*
* PRINT ALL REGISTERS IN A CLASS (A OR D OR R)
*
SPC 2
OFCMD DS 0 "OF" Command -Display Offset registers-
SETO MOVE.B #'R',D7
LEA OFFSET,A3
BRA.S PNTCLSB
SPC 1
PNTCLSD MOVE.B #'D',D7 CLASS=DATA
LEA REGS,A3 OFFSET
BRA.S PNTCLSB
SPC 1
PNTCLSA MOVE.B #'A',D7 CLASS=ADDRESS
LEA REGS+32,A3 OFFSET
PNTCLSB BSR.S PNTCLS
BRA MACSBUG
SPC 1
PNTCLS BSR FIXBUF
CLR.L D6 REGISTER COUNTER
PNTCLS1 BSR.S PNTREG PRINT THE REGISTER
CMP.B #4,D6 DISPLAY AFTER 3&7
BNE.S PNTCLS2
BSR OUT1CR
BSR FIXBUF
BRA PNTCLS1 DO SOME MORE
SPC 1
PNTCLS2 CMP.B #8,D6 AT END?
BNE PNTCLS1
BSR OUT1CR PRINT IT
RTS
SPC 1
* SUBROUTINE TO PRINT REGISTER X#=01234567.
PNTREG MOVE.B D7,(A6)+ CLASS
MOVE.B D6,D0 REG#
BSR PUTHEX
MOVE.B #'=',(A6)+ EQUAL SIGN
MOVE.L D6,D0 COMPUTE ADDRESS OF REG
LSL.L #2,D0 MULT BY FOUR
ADD.L A3,D0 ADD IN OFFSET
MOVE.L D0,A4 SET UP TO GET DEFFERED
CMP.L #REGA7,A4 SEE IF REG A7
BNE.S PNTREG1
MOVE.L REGSR,D0 GET STATUS REGISTER
AND.W #$2000,D0 CHECK SUPERVISOR BIT
BNE.S PNTREG1
LEA REGUS,A4 TAKE ADDRESS OF USER STACK
PNTREG1 MOVE.L (A4),D0 GET REG CONTENT
BSR PNT8HX PUT IN BUFFER
MOVE.B #' ',(A6)+ SPACE
ADD.L #1,D6 BUMP REG#
RTS
SPC 1
END